home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
utility
/
557
/
jampack4
/
ldrunlzh.s
< prev
Wrap
Text File
|
1991-08-05
|
13KB
|
723 lines
; SIMPLE TRAP #1 FILE DEPACKER FOR JAM PACKER V3.0/4.0 LZH COMPRESSION.
; WILL ONLY WORK ON FILES WHICH ARE COMPLETELY READ BY ONE CALL TO
; FREAD (TRAP #1 #$3F).
savebuf = $200
YES equ 1
NO equ 0
LSEEKROUTINE EQU YES ;WHEN PROG USES LSEEK TO DETERMINE FILE LENGTH
SFIRSTROUTINE EQU YES ;WHEN PROG USES SFIRST TO DETERMINE FILE LENGTH
BEGINNING:
BRA.S START
fname: dc.b 'PLAYER.PRG',$00
EVEN
START:
MOVEA.L A7,A5
LEA BEGINNING(PC),A7
MOVE.L 4(A5),A5
MOVE.L $C(A5),D0
ADD.L $14(A5),D0
ADD.L $1C(A5),D0
ADD.L #$100,D0
MOVE.L D0,-(A7)
MOVE.L A5,-(A7)
MOVE.W #$0000,-(A7)
MOVE.W #$004A,-(A7)
TRAP #1
ADDA.L #$0000000C,A7
clr.l -(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
move.l d0,d7
MOVE.L #$1600,-(SP)
MOVE.W #$48,-(SP)
TRAP #1 ;RESERVE SOME SPACE FOR LZH DEPACK TABLES
ADDQ.L #6,SP
MOVE.L D0,BUFPOS
move.l $84.W,oldtrap1vector
move.l #trapit,$84.W
move.l d7,-(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
MOVE.L #NULL,-(SP)
MOVE.L #NULL,-(SP)
PEA fname(PC)
MOVE.W #0,-(SP)
MOVE.W #$4B,-(SP)
TRAP #1
add.l #14,sp
;ENSURE THAT YOU CAN QUIT OUT OF PROGRAMS WITHOUT A CRASH
clr.l -(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
move.l oldtrap1vector(pc),$84.w
move.l d0,-(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
clr.w -(sp)
trap #1
trapit:
btst #$05,(a7)
bne.S super
move.l usp,a0
bra.S after
super:
move.l a7,a0
addq.l #6,a0
after:
cmp.w #$3d,(a0)
beq doopen
cmp.w #$3f,(a0)
beq.s load
IFNE LSEEKROUTINE
cmp.w #$42,(a0)
beq.s down
ENDC
IFNE SFIRSTROUTINE
cmp.w #$4e,(a0)
beq.s dosfirst
cmp.w #$2f,(a0)
beq.s dogetdta
cmp.w #$1a,(a0)
ENDC
bne dotrap1
IFNE SFIRSTROUTINE
lea retsetdta(pc),a0
move.l 2(a7),(a0)
lea setdta(pc),a0
move.l a0,2(a7)
bra dotrap1
dogetdta:
lea retgetdta(pc),a0
move.l 2(a7),(a0)
lea getdta(pc),a0
move.l a0,2(a7)
bra dotrap1
ENDC
doopen:
lea retopen(pc),a0
move.l 2(a7),(a0)
lea open(pc),a0
move.l a0,2(a7)
bra dotrap1
;here starts the stuff for SFIRST
IFNE SFIRSTROUTINE
dosfirst:
lea retsfirst(pc),a0
move.l 2(a7),(a0)
lea sfirst(pc),a0
move.l a0,2(a7)
bra.s dotrap1
ENDC
;here start the stuff for LSEEK
IFNE LSEEKROUTINE
down:
lea retlseek(pc),a0
move.l 2(a7),(a0)
lea lseek(pc),a0
move.l a0,2(a7)
bra.s dotrap1
ENDC
load:
move.w inopen(pc),d0
cmp.w #1,d0
beq.s dotrap1 ;if checking depack marker, do real trap1!
move.w seekflag(pc),d0
cmp.w #1,d0
beq.s dotrap1 ;if called from seek handler, exit!
move.w mustdecrun(pc),d0
cmp.w #1,d0
bne.s dotrap1 ;if marker not present, don't decrunch!
move.l a7,d0
movem.l a1-a3,-(sp)
sub.l #$20,8(a0)
lea buffer(pc),a1
move.l 8(a0),(a1)
move.l d0,a2
lea return(pc),a1
move.l 2(a2),(a1)
lea decrunch(pc),a1
move.l a1,2(a2)
move.l buffer(pc),a1
lea savebuf,a2
move.l #$20,a3
loadloop:
move.b (a1)+,(a2)+
subq.l #1,a3
cmp.l #0,a3
bne.s loadloop
movem.l (sp)+,a1-a3
dotrap1:
dc.w $4ef9
oldtrap1vector:
dc.l $00
;**************************
open:
tst.l d0
bmi exitopen2
movem.l a1-a3,-(sp)
move.l d0,a3
lea inopen(pc),a1
move.w #1,(a1)
pea test(pc)
move.l #8,-(sp)
move.w a3,-(sp)
move.w #$3f,-(sp)
trap #1
add.l #12,sp
tst.l d0 ;ADDED TO FIX ZERO LENGTH FILE
beq.s notcrun ;DITTO
move.l magic(pc),d0
cmp.l test(pc),d0
bne.s notcrun
lea mustdecrun(pc),a1
move.w #1,(a1)
bra.s skipit
notcrun:
lea mustdecrun(pc),a1
move.w #0,(a1)
skipit:
move.w #1,-(sp)
move.w a3,-(sp)
move.l #-8,-(sp)
move.w #$42,-(sp)
trap #1
add.l #10,sp
move.l a3,d0
exitopen:
lea inopen(pc),a1
move.w #0,(a1)
movem.l (sp)+,a1-a3
exitopen2:
dc.w $4ef9
retopen: ;exit
dc.l $00
inopen:
dc.w 0
test:
dc.l 0
unpaklen:
dc.l 0
mustdecrun:
dc.w 0
magic:
dc.b 'LZH!'
IFNE SFIRSTROUTINE
;***************************
getdta:
lea dta(pc),a0
move.l d0,(a0)
dc.w $4ef9
retgetdta:
dc.l $00
;****************************
setdta:
lea dta(pc),a0
move.l 2(a7),(a0)
dc.w $4ef9
retsetdta:
dc.l $00
;*********************************** FOR $4E (SFIRST)
sfirst:
tst.l d0
bne pissoff
move.l 2(a7),a0
movem.l a1-a3,-(sp)
move.w #$2,-(sp)
move.l a0,-(sp)
move.w #$3d,-(sp)
trap #1
addq.l #8,sp
lea sfirsthandle(pc),a1
move.w d0,(a1)
move.w mustdecrun(pc),d0
cmp.w #1,d0
beq.s change
bra.s afterchange
change:
move.l dta(pc),a0
add.l #26,a0
move.l unpaklen(pc),d0
move.l d0,(a0)
afterchange:
move.w sfirsthandle(pc),-(sp)
move.w #$3e,-(sp)
trap #1
addq.l #4,sp
movem.l (sp)+,a1-a3
pissoff:
dc.w $4ef9
retsfirst: ;exit
dc.l $00
ENDC
;*********************************** FOR $42 (LSEEK) IN TRAP1
IFNE LSEEKROUTINE
lseek:
cmp.w #2,8(a7)
bne vamos3
cmp.l #0,2(a7)
bne vamos3
lea seekhandle(pc),a0
move.w 6(a7),(a0)
lea sd0save(pc),a0
move.l d0,(a0)
move.w mustdecrun(pc),d0
cmp.w #1,d0
bne.s vamos
move.l unpaklen(pc),d0
bra.s vamos3
vamos:
move.l sd0save(pc),d0
vamos3:
dc.w $4ef9
retlseek: ;exit
dc.l $00
ENDC
;************************************ FOR $3F (READ) IN TRAP1
decrunch:
;a0 - start of crunched data
;a1 - beginning of uncrunching area
movem.l d0-d7/a0-a6,-(sp)
move.l buffer(pc),a0
lea origlen(pc),a1
move.l 4(a0),(a1)
move sr,d1
btst #13,d1
bne nochange
clr.l -(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
lea jek(pc),a6
move.l d0,(a6)
lea mode(pc),a1
move.w #1,(a1) ;1 denotes must return to user mode
nochange:
lea colstore(pc),a1
move.w $fff8240,(a1)
move.l buffer(pc),a0
move.l a0,a1
add.l #$20,a1
BSR DEPACK
move.w colstore(pc),$fff8240
;restore memory saved in buffer
move.l buffer(pc),a1
lea savebuf,a2
move.l #$20,a3
loadloop2:
move.b (a2)+,(a1)+
subq.l #1,a3
cmp.l #0,a3
bne.s loadloop2
move.w mode(pc),d0
cmp.w #1,d0
bne nochange2
move.l jek(pc),-(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
nochange2:
lea mode(pc),a1
move.w #$00,(a1)
movem.l (sp)+,d0-d7/a0-a6
move.l origlen(pc),d0
dc.w $4ef9
return: ;exit decrunch module
dc.l $00
* LZH DEPACKER For use with the JAM Packer V3.0/V4.0
*
* USAGE:
* LEA $ADDRESS OF PACKED DATA,A0
* LEA $ADDRESS TO UNPACK DATA TO,A1
* BSR DEPACK
*
* NOTE: Must save registers before executing depack if original
* contents are required.
RESET MOVEM.W D0-D1/D3/D5,-(A7)
MOVEA.L A1,A2
MOVEQ #$00,D2
MOVEQ #-$02,D4
MOVEQ #$00,D1
MOVE.W #$0139,D5
OUTER ADDQ.W #2,D4
CMP.W (A2)+,D7
BHI.S OUTER
MOVE.W $00(A3,D4.W),D3
ADDQ.W #1,D3
LSR.W #1,D3
CMP.W -$02(A3,D2.W),D3
BLS.S BIDDLE
MOVE.W $00(A3,D1.W),D0
ADD.W $02(A3,D1.W),D0
CMP.W D0,D3
BLS.S BIDDLE
BITH MOVE.W D0,$00(A3,D2.W)
MOVE.W D1,$00(A1,D2.W)
MOVE.W D2,$00(A0,D1.W)
MOVE.W D2,$02(A0,D1.W)
ADDQ.W #2,D2
ADDQ.L #4,D1
MOVE.W $00(A3,D1.W),D0
ADD.W $02(A3,D1.W),D0
CMP.W D0,D3
BHI.S BITH
BIDDLE MOVE.W D3,$00(A3,D2.W)
MOVE.W $00(A1,D4.W),D0
MOVE.W D0,$00(A1,D2.W)
MOVE.W D2,$00(A0,D0.W)
ADDQ.W #2,D2
DBF D5,OUTER
MAKETABLE2
MOVE.W $00(A3,D1.W),D0
ADD.W $02(A3,D1.W),D0
MOVE.W D0,$00(A3,D2.W)
MOVE.W D1,$00(A1,D2.W)
MOVE.W D2,$00(A0,D1.W)
MOVE.W D2,$02(A0,D1.W)
ADDQ.W #2,D2
ADDQ.L #4,D1
CMP.W D7,D2
BNE.S MAKETABLE2
MOVEM.W (A7)+,D0-D1/D3/D5
RTS
CREATE MOVE.L TABLE7(PC),A0
LEA TDATA1(PC),A1
MOVEQ #$00,D0
MOVEQ #$1F,D1
MOVEQ #$00,D2
LOOP1 MOVE.B D0,(A0)+
DBF D1,LOOP1
DBF D2,EXIT1
MOVE.W (A1)+,D3
MOVEQ #$03,D2
EXIT1 ROL.W #4,D3
MOVE.W D3,D1
ANDI.W #$000F,D1
ADDQ.B #4,D0
BCC.S LOOP1
MOVE.L TABLE8(PC),A0
LEA TDATA2(PC),A1
MOVEQ #$05,D0
MOVEQ #$03,D1
LOOP2 MOVE.B $00(A1,D0.W),D2
EXT.W D2
LOOP3 MOVE.B D1,(A0)+
DBF D2,LOOP3
ADDQ.W #1,D1
DBF D0,LOOP2
RTS
CREATE2 MOVE.L TABLE1(PC),A0
MOVE.L TABLE5(PC),A1
MOVE.L TABLE4(PC),A2
MOVEQ #$01,D1
MOVE.W #$04E6,D2
MOVEQ #$00,D4
MOVE.W #$0139,D0
CONTINUE
MOVE.W D1,(A0)+
MOVE.W D2,(A1)+
MOVE.W D4,(A2)+
ADDQ.W #2,D2
ADDQ.W #2,D4
DBF D0,CONTINUE
MOVE.L TABLE1(PC),A0
MOVE.L TABLE2(PC),A3
MOVE.L TABLE6(PC),A1
MOVE.L TABLE3(PC),A2
MOVE.W #$0274,D2
MOVEQ #$00,D4
MOVE.W #$0138,D0
DOMORE MOVE.W (A0)+,D1
ADD.W (A0)+,D1
MOVE.W D1,(A3)+
MOVE.W D4,(A1)+
MOVE.W D2,(A2)+
MOVE.W D2,(A2)+
ADDQ.W #4,D4
ADDQ.W #2,D2
DBF D0,DOMORE
MOVE.W #$FFFF,(A3)
CLR.W (A2)
RTS
RESTORE BSR RESET
BRA BACK
TABLE1 DC.L 00
TABLE2 DC.L 00
TABLE3 DC.L 00
TABLE4 DC.L 00
TABLE5 DC.L 00
TABLE6 DC.L 00
TABLE7 DC.L 00
TABLE8 DC.L 00
BUFPOS: DC.L 00
EXIT
ADDQ.L #4,A7
RTS
DEPACK
MOVE.L A0,A5
MOVE.L A1,A6
LEA TABLE1(PC),A0
MOVE.L #0,(A0) ;SET UP RELATIVE TABLE OFFSETS
MOVE.L #$274,4(A0)
MOVE.L #$4E8,8(A0)
MOVE.L #$9CE,12(A0)
MOVE.L #$C42,16(A0)
MOVE.L #$EB6,20(A0)
MOVE.L #$112A,24(A0)
MOVE.L #$122A,28(A0)
MOVE.L BUFPOS(PC),D1
TST.L D1
BNE.S DONTUSESCREEN
USESCREEN:
MOVE.B $FFFF8201.W,D6
MOVE.B $FFFF8203.W,D7
LSL.L #8,D6
MOVE.B D7,D6
LSL.L #8,D6
MOVE.L D6,D1
DONTUSESCREEN:
; MOVE.L A7,D1 ;GET STACK POSITON
; sub.l #$1500,D1 ;TABLES START ADDRESS IN D1
;STORE UNDER STACK
MOVE.W #7,D0
TABLOOP
ADD.L D1,(A0)+ ;ADD TABLE BASE ADDRESS TO OFFSETS
DBF D0,TABLOOP
BSR CREATE
BSR CREATE2
MOVE.L TABLE3(PC),A0
MOVE.L TABLE5(PC),A1
MOVE.L TABLE1(PC),A3
MOVE.L A6,-(A7)
ADD.L 4(A5),A6
ADD.L 8(A5),A5
ADD.L #$0C,A5
MOVE.L A6,A4
;THIS IS REQUIRED!
MOVE.W #59,D0 ;MOVE 60 SPACES TO END OF UNPACKED AREA
SPACES MOVE.B #$20,(A4)+ ;NOTE: SHOULD PROBABLY SAVE THIS DATA
DBF D0,SPACES ; BEFORE WIPING IT OUT!
MOVEQ #$08,D6
MOVE.B -(A5),D5
MOVE.W #$04E6,D7
MOVE.L TABLE8(PC),A4
TOP NOT.W $FFFF8240.W
CMPA.L (A7),A6
BLE EXIT
MOVE.W $04E4(A1),D0
MORE DBF D6,NOTEMPTY
MOVEQ #$07,D6
MOVE.B -(A5),D5
NOTEMPTY
ADD.B D5,D5
BCC.S ZERO
ADDQ.W #2,D0
ZERO MOVE.W $00(A1,D0.W),D0
CMP.W D7,D0
BLT.S MORE
MOVE.W D0,D1
SUB.W D7,D0
MOVE.W $04E4(A3),D4
BMI RESTORE
BACK MOVE.W $00(A0,D1.W),D1
SCAN LEA $00(A3,D1.W),A2
ADDQ.W #1,(A2)
CMPM.W (A2)+,(A2)+
BCS.S FRSTGTR
MOVE.W $00(A0,D1.W),D1
BNE.S SCAN
LSR.W #1,D0
CMP.W #$0100,D0
BGE.S GTE256
WRITE MOVE.B D0,-(A6)
BRA.S TOP
FRSTGTR SUBQ.W #1,-$0004(A2)
MOVE.W -$0004(A2),D4
SAME CMP.W (A2)+,D4
BEQ.S SAME
SUBQ.L #4,A2
ADDQ.W #1,(A2)
SUBA.L A3,A2
MOVE.W $00(A1,D1.W),D4
MOVE.W A2,$00(A0,D4.W)
CMP.W D7,D4
BCC.S SKIP
MOVE.W A2,$02(A0,D4.W)
SKIP MOVE.W $00(A1,A2.W),D2
MOVE.W D4,$00(A1,A2.W)
MOVE.W D1,$00(A0,D2.W)
CMP.W D7,D2
BCC.S SKIP2
MOVE.W D1,$02(A0,D2.W)
SKIP2 MOVE.W D2,$00(A1,D1.W)
MOVE.W $00(A0,A2.W),D1
BNE.S SCAN
LSR.W #1,D0
CMP.W #$0100,D0
BLT.S WRITE
GTE256 MOVE.B -1(A5),D1
MOVEQ #$00,D2
LSR.B D6,D1
OR.B D5,D1
MOVE.B $00(A4,D1.W),D2
SUB.W D2,D6
BPL.S POSITIVE
MOVE.B -(A5),D5
MOVE.B D5,D4
ADDQ.W #2,D6
BMI.S OVERFLOW
BEQ.S MODD4
LSR.B #1,D4
LSL.B #7,D5
BRA.S MODD4
READONE MOVE.B -(A5),D5
MOVE.B D5,D4
LSL.B #6,D5
MOVEQ #$02,D6
LSR.B D6,D4
BRA.S DOCOPY
POSITIVE
BEQ.S READONE
MOVE.B (A5),D5
SUBQ.W #6,D6
OVERFLOW
NEG.W D6
LSL.B D6,D5
MOVE.B D5,D4
MOVE.B -(A5),D5
MOVE.B D5,D2
LSL.B D6,D5
SUBQ.W #8,D6
NEG.W D6
LSR.B D6,D2
OR.B D2,D4
MODD4 ANDI.W #$003F,D4
DOCOPY MOVE.L TABLE7(PC),A0
MOVE.B (A0,D1.W),D2
LSL.W #4,D2
OR.B D4,D2
;NEG.W D2
LEA $01(A6,D2.W),A0
SUBI.W #$00FE,D0
MOVE.W D0,D1
COPY MOVE.B -(A0),D0
MOVE.B D0,-(A6)
DBF D1,COPY
MOVE.L TABLE3(PC),A0
BRA TOP
TDATA2 DC.W $0F2F
DC.W $2F3F
DC.W $2F1F
TDATA1
DC.W $FFF7
DC.W $7777
DC.W $7773
DC.W $3333
DC.W $3333
DC.W $3331
DC.W $1111
DC.W $1111
DC.W $1111
DC.W $1111
DC.W $1111
DC.W $1110
DC.L $00
DC.L $00
SECTION DATA
origlen: dc.l $00
oldssp: dc.l $00
buffer: dc.l $00
mode: dc.l $00
jek: dc.l $00
length: dc.l $00
colstore: dc.l $00
seekflag: dc.w $00
seekhandle: dc.w $00
sd0save: dc.l $00
rtlseeksav: dc.l $00
sfirsthandle: dc.l $00
dta: dc.l $00
oldsize: dc.l $00
NULL: DC.L $00